﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio;
using Negocio.catalogos;
using System.Text;
using Microsoft.Reporting.WebForms;

namespace Presentacion.controlasistencia
{
    public partial class ReportePerdidos : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            catalogoCarrera _objCarrera = new catalogoCarrera();
            catalogoDistribucion _objDistribucion = new catalogoDistribucion();
            catalogoPeriodo _objPeriodo = new catalogoPeriodo();
            catalogoReporte _objReporte = new catalogoReporte();
           
            if (!IsPostBack)
            {
                if (Session["admin"]!=null || Session["vicerrectorado"] != null)
                {
                    foreach (var item in _objCarrera.obtenerTodasCarreras())
                    {
                        ddlCarrera.Items.Add(new ListItem(item.carrera,item.idCarrera.ToString()));
                    }
                    foreach (var item in _objPeriodo.obtenerPeriodoxTOP().OrderByDescending(C=>C.idPeriodo))
                    {
                        ddlPeriodo.Items.Add(new ListItem(item.nombre,item.idPeriodo.ToString()));

                    }
                }
                else
                {
                    Response.Redirect("default.aspx");
                }
            }
        }
        [System.Web.Services.WebMethod(true)]
        public static string materiasSemestre(int carrera, int semestre,string paralelo)
        {
            StringBuilder html = new StringBuilder();
            catalogoDistribucion _objDistribucion = new catalogoDistribucion();
            foreach (var item in _objDistribucion.obtenerDistribucionXSemestre(semestre,carrera,paralelo))
            {
                html.Append("<option value="+item.idDistribucion+">"+item.Nombre+"</option>"); 
            }

            return html.ToString();
        }

        protected void btnReporteMensual_Click(object sender, EventArgs e)
        {
            catalogoPeriodo _objCatalogoPeriodo = new catalogoPeriodo();
            catalogoCabecera _objCatalogoCabecera = new catalogoCabecera();
            catalogoHorario _objHorarioClases = new catalogoHorario();
            encriptaje _objEncriptaje = new encriptaje();
            try
            {

                if (Session["admin"] != null || Session["vicerrectorado"] != null)
                {
                    //var postE = Request.Form["ddlReporteMeses"];
                    //string[] valores = postE.Split(new Char[] { '-' });
                    //int mes = Convert.ToInt32(valores[0]);
                    //int anio = Convert.ToInt32(valores[1]);

                    if (ddlPeriodo.SelectedItem.Value != "")//&& postE != "" && postE != null
                    {

                        int idPeriodoActual = int.Parse(ddlPeriodo.SelectedItem.Value.ToString());
                        //int mes = int.Parse(postE);

                        var inicioDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#00a65a");
                        var finDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#0073b7");
                        DateTime fechacomparacion = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                        if (inicioDeClases != null && finDeClases != null)
                        {
                            //if (inicioDeClases.start.Value.Month >= fechacomparacion.Month && ((finDeClases.start.Value.Month <= fechacomparacion.Month) || (finDeClases.start.Value.Month >= fechacomparacion.Month) || (finDeClases.start.Value.Year <= fechacomparacion.Year))) //inicioDeClases.start.Value.Month >= mes && finDeClases.start.Value.Month <= mes
                            //{

                            int codigoDistribucion =Convert.ToInt32(Request.Form["ddlMaterias"]) ;//int.Parse(_objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString()))

                            var resultDistribucion = new catalogoDistribucion().obtenerDistribucionId(codigoDistribucion).First();
                            var resultDistribucionPeriodo = new catalogoDistribucion().obtenerDistribucionXIdPeriodoXNombre(idPeriodoActual, resultDistribucion.Nombre, resultDistribucion.idCarrera);
                            if (resultDistribucionPeriodo.Count() != 0)
                            {
                                codigoDistribucion = resultDistribucionPeriodo.First().idDistribucion;

                            }
                            var resultOpciones = new catalogoOpciones().obtenerNroSemanas(idPeriodoActual);
                            DateTime dia = DateTime.Now; //Obtiene dia actual
                            int totalHoraAcumuladas = 0;

                            //int totalMesActual = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(dia.Year, mes, dia.Day));
                            int totalMesActual = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(DateTime.Now.Year, DateTime.Now.Month, dia.Day));
                            var periodo = new catalogoPeriodo().obtenerPeriodo(idPeriodoActual).First();


                            #region Datos Horario

                            string[] diasSemana = new string[] { "LU", "MA", "MI", "JU", "VI" };
                            //Buscar inicio de semana
                            //Inicio busqueda inicio de semana
                            while (dia.DayOfWeek != DayOfWeek.Monday)
                            {
                                if (dia.DayOfWeek == DayOfWeek.Sunday)
                                {
                                    dia = dia.AddDays(1);
                                }
                                else
                                {
                                    dia = dia.AddDays(-1);
                                }
                            }

                            //Carga del horario para validacion
                            var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(idPeriodoActual, codigoDistribucion);
                            int totalSemanal = 0;
                            if (consultaHorario.Count() > 0)
                            {
                                //Bucle por cada de la semana
                                totalSemanal = 0;
                                for (int i = 0; i < 5; i++)
                                {
                                    int nroHoraDistribucion = 0;

                                    var resultFiltroHorario = consultaHorario.Where(E => E.detalle == dia.DayOfWeek.ToString()).ToList();
                                    if (resultFiltroHorario.Count() > 0)
                                    {

                                        foreach (var item in resultFiltroHorario)
                                        {
                                            TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.horaEntrada);
                                            TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.horaSalida);

                                            //    DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                            //  DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin
                                            DateTime dia1 = new DateTime(DateTime.Now.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                            DateTime dia2 = new DateTime(DateTime.Now.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                            nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;
                                            totalSemanal = totalSemanal + nroHoraDistribucion;
                                            //fin busqueda dia de la semana                   

                                        }
                                    }
                                    dia = dia.AddDays(1);

                                }
                            }
                            else
                            {
                                totalSemanal = 0;
                            }
                            #endregion

                            if (resultOpciones != null)
                            {
                                totalHoraAcumuladas = resultOpciones.nroSemanas * totalSemanal;
                            }
                            else
                            {
                                totalHoraAcumuladas = 0;
                            }
                            //int totalMesesAnterior = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(dia.Year, mes - 1, dia.Day));
                            if (DateTime.Now.Month==1)
                            {
                                int totalMesesAnterior = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(DateTime.Now.Year-1, 12, dia.Day));
                            }
                            else
                            {
                                int totalMesesAnterior = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(DateTime.Now.Year, DateTime.Now.Month - 1, dia.Day));
                            }

                            string mesTexto = "";
                            switch (DateTime.Now.Month)
                            {
                                case 1:
                                    mesTexto = "ENERO";
                                    break;
                                case 2:
                                    mesTexto = "FEBRERO";
                                    break;
                                case 3:
                                    mesTexto = "MARZO";
                                    break;
                                case 4:
                                    mesTexto = "ABRIL";
                                    break;
                                case 5:
                                    mesTexto = "MAYO";
                                    break;
                                case 6:
                                    mesTexto = "JUNIO";
                                    break;
                                case 7:
                                    mesTexto = "JULIO";
                                    break;
                                case 8:
                                    mesTexto = "AGOSTO";
                                    break;
                                case 9:
                                    mesTexto = "SEPTIEMBRE";
                                    break;
                                case 10:
                                    mesTexto = "OCTUBRE";
                                    break;
                                case 11:
                                    mesTexto = "NOVIEMBRE";
                                    break;
                                case 12:
                                    mesTexto = "DICIEMBRE";
                                    break;
                                default:
                                    break;
                            }

                            var resultCAbeceralista = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoFiltradoColumnas(codigoDistribucion, idPeriodoActual);
                       
                            var resultCabeceraNormal = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPerido(codigoDistribucion, idPeriodoActual);
                            ReportParameter[] reportParameter = new ReportParameter[22];//(resultCabecera.Count() * 4) + 29
                            int contador = 0, iT = 1;
                            if (resultCAbeceralista.Count() > 0)
                            {

                                //if (resultCAbeceralista.Count() > 12)
                                //{
                                //    ReportViewer1.Visible = false;
                                //    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('informe desbordado, contactese con el administrador.');", true);
                                //}
                                //else
                                //{

                                    foreach (var item in resultCAbeceralista)
                                    {
                                        //reportParameter[contador] = new ReportParameter("dia" + iT, item.fechaCabecera.Day.ToString());
                                        //contador++;
                                        //reportParameter[contador] = new ReportParameter("asi" + iT, item.observacion);
                                        //contador++;
                                        //reportParameter[contador] = new ReportParameter("mes" + iT, item.fechaCabecera.Month.ToString());
                                        //contador++;
                                        int totalHoras = 0;
                                        foreach (var itemHoras in resultCabeceraNormal.Where(R => R.fechaCabecera.Date == item.fechaCabecera))
                                        {
                                            TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.idDetalleHorario.horaEntrada);
                                            TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.idDetalleHorario.horaSalida);

                                            DateTime diaHora = DateTime.Now; //Obtiene dia actual
                                                                             //DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                                                             //DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin
                                            DateTime dia1 = new DateTime(DateTime.Now.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                            DateTime dia2 = new DateTime(DateTime.Now.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                            int horaClaseColumna = (dia2.Subtract(dia1)).Hours;
                                            totalHoras = totalHoras + horaClaseColumna;
                                        }


                                        //reportParameter[contador] = new ReportParameter("hora" + iT, totalHoras.ToString());
                                        //contador++;
                                        iT++;
                                    }

                                    reportParameter[contador] = new ReportParameter("mesActual", mesTexto);
                                    contador++;

                                    var resultDocente = new catalogoDocente().consultarDocenteXId(resultDistribucion.idDocente);
                                    if (resultDocente != null)
                                    {
                                        reportParameter[contador] = new ReportParameter("docente", resultDocente.nombre + " " + resultDocente.apellido1 + " " + resultDocente.apellido2);
                                        contador++;
                                    }
                                    else
                                    {
                                        reportParameter[contador] = new ReportParameter("docente", Session["nombresDocente"].ToString() + " " + Session["apellido"].ToString());
                                        contador++;
                                    }

                                    reportParameter[contador] = new ReportParameter("cursoMateria", resultDistribucion.Nombre);
                                    contador++;
                                    reportParameter[contador] = new ReportParameter("semestre", resultDistribucion.semestre.ToString());
                                    contador++;
                                    reportParameter[contador] = new ReportParameter("paralelo", resultDistribucion.paralelo);
                                    contador++;
                                    //reportParameter[contador] = new ReportParameter("totalAcumuladorSemestre", totalHoraAcumuladas.ToString());
                                    //contador++;
                                    //reportParameter[contador] = new ReportParameter("totalMesAnterior", totalMesesAnterior.ToString());
                                    //contador++;
                                    //reportParameter[contador] = new ReportParameter("totalAsistenciaMes", totalMesActual.ToString());
                                    //contador++;
                                    var horasJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(codigoDistribucion, idPeriodoActual, 2).Sum(E => E.nroHoras);
                                    var horasINJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(codigoDistribucion, idPeriodoActual, 2).Sum(E => E.nroHoras);

                                    //reportParameter[contador] = new ReportParameter("totalHorasNoTrabajadas", (horasINJustificada + horasJustificada).ToString());
                                    //contador++;
                                    //reportParameter[contador] = new ReportParameter("totalHorasXSemanas", totalSemanal.ToString());
                                    //contador++;
                                    reportParameter[contador] = new ReportParameter("carrera", resultDistribucion.carrera);
                                    contador++;
                                    reportParameter[contador] = new ReportParameter("periodo", periodo.nombre);
                                    contador++;

                                    //reportParameter[contador] = new ReportParameter("observaciones", new catalogoReporte().reporteObservaciones(idPeriodoActual, new DateTime(DateTime.Now.Year, DateTime.Now.Month, dia.Day)));
                                    //contador++;

                                    //var carrera = new catalogoCarrera().obtenerTodasCarreras().Where(W => W.carrera == resultDistribucion.carrera).FirstOrDefault();
                                    //if (carrera != null)
                                    //{
                                    //    var _coordinador = new catalogoUsuario().consultarCoordinador((int)resultDistribucion.semestre, carrera.idCarrera);
                                    //    if (_coordinador != null)
                                    //    {
                                    //        var resultCoordinador = new catalogoDocente().consultarDocenteXId(_coordinador.idDocente);
                                    //        if (resultCoordinador != null)
                                    //        {
                                    //            reportParameter[contador] = new ReportParameter("coordinador", resultCoordinador.nombre + " " + resultCoordinador.apellido1 + " " + resultCoordinador.apellido2);
                                    //            contador++;
                                    //        }
                                    //        else
                                    //        {
                                    //            reportParameter[contador] = new ReportParameter("coordinador", "");
                                    //            contador++;
                                    //        }
                                    //    }
                                    //    else
                                    //    {
                                    //        reportParameter[contador] = new ReportParameter("coordinador", "");
                                    //        contador++;
                                    //    }

                                    //}
                                    //else
                                    //{
                                    //    reportParameter[contador] = new ReportParameter("coordinador", "");
                                    //    contador++;
                                    //}
                                    var resultHorario = new catalogoReporte().obtenerHorario(idPeriodoActual, codigoDistribucion);
                                    iT = 1;
                                    foreach (var item in resultHorario)
                                    {
                                        reportParameter[contador] = new ReportParameter("ent" + iT, item.horaInicio);
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("sal" + iT, item.horaFin);
                                        contador++;
                                        reportParameter[contador] = new ReportParameter("hor" + iT, item.horaClase);
                                        contador++;
                                        iT++;
                                    }

                                    ReportViewer1.LocalReport.DataSources.Clear();

                                    ReportDataSource dataSourceAsistencia = new ReportDataSource();

                                    dataSourceAsistencia.Name = "dtsReportPerdidos";
                                    dataSourceAsistencia.Value = new catalogoReporte().reportePerdedores(Convert.ToInt32(ddlPeriodo.SelectedValue), codigoDistribucion);

                                    ReportViewer1.LocalReport.DataSources.Add(dataSourceAsistencia);

                                    ReportViewer1.LocalReport.ReportEmbeddedResource = "Presentacion.controlasistencia.reports.ReportPerdidos.rdlc";
                                    ReportViewer1.LocalReport.ReportPath = "controlasistencia/reports/ReportPerdidos.rdlc";

                                    ReportViewer1.LocalReport.SetParameters(reportParameter);
                                    ReportViewer1.LocalReport.GetParameters();
                                    ReportViewer1.Visible = true;
                                    ReportViewer1.DataBind();
                                    ReportViewer1.LocalReport.Refresh();
                                //}
                                ddlPeriodo.ClearSelection();
                            }
                            else
                            {
                                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('No existen datos para este reporte.');", true);
                                ddlPeriodo.ClearSelection();
                            }
                           
                        }
                        else
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Error contactase con el administrador.');", true);
                            ddlPeriodo.ClearSelection();
                        }
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Seleccione los parametros de busqueda');", true);
                        ddlPeriodo.ClearSelection();
                        ReportViewer1.Visible = false;
                    }
                }
                else
                {
                    Server.Transfer("Default.aspx");
                }
            }
            catch (Exception )
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Error en el servidor intentelo de nuevo');", true);
                ReportViewer1.Visible = false;
            }

                
          
            
        }
    }
}